﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel;
using System.Text;
// Espacios de nombre para poder usar la BD
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace CityGames
{
    public class CADEmpleado
    {

        /******************************************Funciones de Gonzalo********************************/
        static private string cadConexion = System.Configuration.ConfigurationManager.ConnectionStrings["CityGames.Properties.Settings.BDCityGamesConnectionString"].ConnectionString;

        public DataSet ObtenerDatos(string select, string nombreTabla)
        {
            DataSet resultado = new DataSet();

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                da.Fill(resultado, nombreTabla);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }


        public bool InsertarDatosModificados(DataSet datosModificados, string nombreTabla, string select)
        {
            bool resultado = false;

            try
            {
                SqlConnection conexion = new SqlConnection(cadConexion);
                SqlDataAdapter da = new SqlDataAdapter(select, conexion);
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                da.Update(datosModificados, nombreTabla);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public bool BorrarEmpleado(string dni)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlCommand comandoSql;
            string delete = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                delete = "DELETE FROM Persona WHERE (DNI = '" + dni + "')";

                comandoSql = new SqlCommand(delete, conexion);
                comandoSql.ExecuteNonQuery();

                resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public DataSet FiltrarEmpleados(string nombre, string apellidos, string dni, string sexo, string tipo, int desde, int hasta)
        {
            DataSet resultado = new DataSet();
            string select = "";
            
            try
            {
                select += "SELECT   Nombre, Apellidos, Dni, Sexo, Telefono, E_mail, Password, Tipo ";
                select += "FROM         (   SELECT     Nombre, Apellidos, p.Dni, Sexo, Telefono, E_mail, Password, Tipo,  ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW ";
                select += "FROM     Empleado e, Persona p ";
                select += "WHERE    e.dni=p.dni ";
                if (nombre != "")
                    select += "AND (Nombre LIKE '%" + nombre + "%') ";
                if (apellidos != "")
                    select += "AND (Apellidos LIKE '%" + apellidos + "%') ";
                if (dni != "")
                    select += "AND (p.Dni LIKE '%" + dni + "%')";
                if (sexo == "Hombre")
                    select += " AND (Sexo = 'Hombre')";
                else if (sexo == "Mujer")
                    select += " AND (Sexo = 'Mujer')";
                if (tipo != "Todos")
                    select += " AND (Tipo LIKE '%" + tipo + "%') ";
                select += ") AS EmpleadosFiltrados ";
                select += "WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ") ";

                resultado = ObtenerDatos(select, "EmpleadosFiltrados");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }
        
        public int ObtenerNumeroDeEmpleadosFiltrados(string nombre, string apellidos, string dni, string sexo, string tipo)
        {
            int resultado = 0;
            string select = "";
            SqlConnection conexion = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                if (tipo == "Todos")
                    tipo = "%";

                select += "SELECT COUNT(*) ";
                select += "FROM   empleado e, persona p ";
                select += "WHERE  p.dni=e.dni AND (Nombre LIKE '%" + nombre + "%') AND (Apellidos like '%" + apellidos + "%') AND (Tipo like '" + tipo + "') AND (p.Dni like '%" + dni + "%') ";
                if (sexo == "Hombre")
                    select += " AND (Sexo = 'Hombre') ";
                else if (sexo == "Mujer")
                    select += " AND (Sexo = 'Mujer') ";

                SqlCommand comandoSql = new SqlCommand(select, conexion);
                SqlDataReader dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = int.Parse(dr[0].ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }
        
        public bool ActualizarEmpleado(DataSet empleados, string nombre, string apellidos, string dni, string sexo, string tipo, int desde, int hasta)
        {
            string select = "";
            bool resultado = false;

            try
            {
                select += "SELECT   Nombre, Apellidos, Dni, Sexo, Telefono, E_mail, Password, Tipo";
                select += " FROM         (SELECT     Nombre, Apellidos, p.Dni, Sexo, Telefono, E_mail, Password, Tipo, ROW_NUMBER() OVER (ORDER BY Nombre ASC) AS ROW ";
                select += "FROM     Empleado e, Persona p";
                select += " WHERE    (Nombre LIKE '%" + nombre + "%') AND (Apellidos LIKE '%" + apellidos + "%') AND (p.Dni LIKE '%" + dni + "%') ";
                if (tipo != "Todos")
                    select += " AND (Tipo = '" + tipo + "') ";
                select += "  AND (Sexo LIKE '%" + sexo + "%')) AS EmpleadosFiltrados ";
                select += " WHERE     (ROW > " + desde.ToString() + ") AND (ROW <= " + hasta.ToString() + ")";

                resultado = InsertarDatosModificados(empleados, "EmpleadosFiltrados", select);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return resultado;
        }

        public bool ExisteEmpleado(string dni)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlCommand comandoSql = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT DNI FROM Empleado WHERE DNI = @dni";

                comandoSql = new SqlCommand(select, conexion);

                comandoSql.Parameters.Add("@dni", SqlDbType.VarChar, 9);
                comandoSql.Parameters["@dni"].Value = dni;

                dr = comandoSql.ExecuteReader();

                if (dr.Read())
                    resultado = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool AltaEmpleado(string nombre, string apellidos, string dni, string sexo, string telefono, string e_mail, string password, string tipo)
        {
            bool resultado = false;

            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql = null;
            string insert = "";

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();
                tr = conexion.BeginTransaction();

                /*________________________ Insert en Persona _____________________*/
                insert = "INSERT INTO Persona (Nombre, Apellidos, Dni, Sexo, Telefono, E_mail) ";
                insert += "VALUES ('" + nombre + "', '" + apellidos + "', '" + dni + "', '" + sexo + "', '" + telefono + "', '" + e_mail + "')";

                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                /*________________________ Insert en Empleado _____________________*/

                insert = "INSERT INTO Empleado (Dni, Password, Tipo) ";
                insert += "VALUES ('" + dni + "', '" + password + "', '" + tipo + "')";

                comandoSql = new SqlCommand(insert, conexion);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();
                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool UpdateEmpleado(DataRow dr)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlTransaction tr = null;
            SqlCommand comandoSql;
            string update = "";


            string nombre = dr["Nombre"].ToString();
            string apellidos = dr["Apellidos"].ToString();
            string sexo = dr["Sexo"].ToString();
            string telefono = dr["Telefono"].ToString();
            string email = dr["E_mail"].ToString();

            string dni = dr["Dni"].ToString();
            string password = dr["Password"].ToString();
            string tipo = dr["Tipo"].ToString();

            try
            {
                update = "UPDATE Persona ";
                update += "SET Nombre = '" + nombre + "', Apellidos = '" + apellidos + "', Dni = '" + dni + "', Sexo = '" + sexo + "', Telefono = '" + telefono + "', E_mail = '" + email + "' ";
                update += "WHERE Dni ='" + dni + "';";

                update += "UPDATE Empleado ";
                update += "SET Dni = '" + dni + "', Password = '" + password + "', Tipo = '" + tipo + "' ";
                update += "WHERE Dni ='" + dni + "';";

                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                tr = conexion.BeginTransaction();

                comandoSql = new SqlCommand(update, conexion);
                comandoSql.Transaction = tr;
                comandoSql.ExecuteNonQuery();

                tr.Commit();
                resultado = true;
            }
            catch (Exception ex)
            {
                tr.Rollback();
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }
        /**********************************************Funciones de Mirellys ****************************************/
        /// <summary>
        /// Función que obtiene la contraseña del empleado cuyo dni y tipo se recibe como parametro
        /// Mirellys
        /// </summary>
        /// <returns>String resultado</returns>
        public string getPassword(string dni)
        {
            string resultado = "";
            string select = "";
            
            SqlConnection c = null;
            SqlCommand command = null;
            SqlDataReader dr = null;
            
            try
            {
                c = new SqlConnection(cadConexion);
                c.Open();

                select = "SELECT Password as Pass FROM Empleado WHERE DNI=@dni";
                
                command = new SqlCommand(select, c);

                command.Parameters.Add("@dni", SqlDbType.VarChar,9);
                command.Parameters["@dni"].Value = dni;
                
                dr = command.ExecuteReader();

                if (dr.Read())
                    resultado = dr["Pass"].ToString();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                c.Close();
            }
            return resultado;
        }

        /// <summary>
        /// Función que obtiene los diferentes tipos de empleado del sistema
        /// Mirellys
        /// </summary>
        /// <returns>DataSet Tipo Empleado</returns>
        public DataSet ObtenerTiposEmpleado()
        {
            string comando = "SELECT DISTINCT Tipo FROM Empleado";
            SqlConnection c = null;
            DataSet dataS = null;

            try
            {
                c = new SqlConnection(cadConexion);
                c.Open();
                SqlDataAdapter dataA = new SqlDataAdapter(comando, cadConexion);
                dataS = new DataSet();
                dataA.Fill(dataS, "TiposEmpleado");
                return dataS;
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally 
            {
                if (c != null)
                {
                    c.Close();
                }
            }
        }

        /// <summary>
        /// Función que obtiene el tipo de empleado que es una persona segun el dni que recibe
        /// </summary>
        /// <returns>entero tipo de empleado</returns>
        public string ObtenerTipoEmpleado(string dni)
        {
            string resultado = "";
            string select = "";

            SqlConnection c = null;
            SqlCommand command = null;
            SqlDataReader dr = null;

            try
            {
                c = new SqlConnection(cadConexion);
                c.Open();

                select = "SELECT Tipo FROM Empleado WHERE DNI=@dni";

                command = new SqlCommand(select, c);

                command.Parameters.Add("@dni", SqlDbType.VarChar, 9);
                command.Parameters["@dni"].Value = dni;

                dr = command.ExecuteReader();

                if (dr.Read())
                    resultado = dr["Tipo"].ToString();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (c != null)
                    c.Close();
            }

            return resultado;
        }

        /************************************************** Funciones de Marcos **************************************************/

        public bool EsAdministrador(string dni)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlCommand comandoSql = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT Tipo FROM Empleado WHERE (DNI = @dni)";

                comandoSql = new SqlCommand(select, conexion);

                comandoSql.Parameters.Add("@dni", SqlDbType.VarChar, 9);
                comandoSql.Parameters["@dni"].Value = dni;

                dr = comandoSql.ExecuteReader();

                if (dr.Read())
                {
                    if (dr["Tipo"].ToString() == "AdministradorWeb")
                        resultado = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        public bool EsModerador(string dni)
        {
            bool resultado = false;
            SqlConnection conexion = null;
            SqlCommand comandoSql = null;
            SqlDataReader dr = null;

            try
            {
                conexion = new SqlConnection(cadConexion);
                conexion.Open();

                string select = "SELECT Tipo FROM Empleado WHERE (DNI = @dni)";

                comandoSql = new SqlCommand(select, conexion);

                comandoSql.Parameters.Add("@dni", SqlDbType.VarChar, 9);
                comandoSql.Parameters["@dni"].Value = dni;

                dr = comandoSql.ExecuteReader();

                if (dr.Read())
                {
                    if (dr["Tipo"].ToString() == "Moderador")
                        resultado = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conexion != null)
                    conexion.Close();
            }

            return resultado;
        }

        /************************************************** Fin Funciones de Marcos **************************************************/
    }
}
